﻿namespace zijian666.WorkScheduler.Defines;
/// <summary>
/// 表示一个工作状态。
/// </summary>
[Flags]
public enum WorkStatus
{
    /* 数据位说明
     * 0b_0000_000*: 1 执行，0 停止。
     * 0b_0000_00*0: 1 完成，0 未完成
     * 0b_0000_0*00: 1 成功，0 未成功
     * 0b_0000_*000: 1 异常，0 无异常
     * 0b_000*_0000: 1 被取消
     * 0b_00*0_0000: 1 超时
     * 0b_0*00_0000: 1 数据丢失
     * 0b_*000_0000: [保留]
     */

    /// <summary>
    /// 工作处于等待状态。
    /// </summary>
    Pending = 0b_0000,
    /// <summary>
    /// 工作正在执行。
    /// </summary>
    Running = 0b_0001,
    /// <summary>
    /// 工作已完成。
    /// </summary>
    Completed = 0b_0010,
    /// <summary>
    /// 工作执行成功。
    /// </summary>
    Success = 0b_0110,
    /// <summary>
    /// 工作执行异常。
    /// </summary>
    Error = 0b_0000_1010,
    /// <summary>
    /// 工作已取消。
    /// </summary>
    Canceled = 0b_0001_0010,
    /// <summary>
    /// 工作已超时。
    /// </summary>
    Timeout = 0b_0010_0010,
    /// <summary>
    /// 数据丢失。
    /// </summary>
    Missing = 0b_0100_1010,
}

public static class WorkStatusExtensions
{
    /// <summary>
    /// 判断状态是否已完成。
    /// </summary>
    public static bool IsCompleted(this WorkStatus status)
        => (status & WorkStatus.Completed) is WorkStatus.Completed;

    /// <summary>
    /// 判断状态是否已完成。
    /// </summary>
    public static bool IsCompleted(this WorkStatus? status)
        => status.HasValue && status.Value.IsCompleted();
}